#include "BlockQueue.hpp"
#include "Thread.hpp"

using namespace yss;

//消费
void Consumer(BlockQueue<int> &bq)//引用是为了使用同一个队列
{
    while (true)
    {
        // sleep(3);
        // int data;
        // bq.Pop(&data);
        // cout << "Consumer: " << data << endl;
        cout << "Consumer: " << endl;
        sleep(1);
    }
}
//生产
void Productor(BlockQueue<int> &bq)
{
    int cnt = 1;
    while (true)
    {
        // bq.Enqueue(cnt);
        // cout << "Productor: " << cnt++ << endl;
        cout << "Productor: " << endl;
        sleep(1);
    }
}
// 共用代码
void StartComm(vector<Thread<BlockQueue<int>>> *thread, int num, BlockQueue<int> &bq, func_t<BlockQueue<int>> func)
{
    for (int i = 0; i < num; i++)
    {
        string name = "thread-" + to_string(i + 1);
        thread->emplace_back(func, bq, name); // 保存数据
        thread->back().Satrt();               // 创建线程
    }
}
// 消费者
void StartConsumer(vector<Thread<BlockQueue<int>>> *thread, int num, BlockQueue<int> &bq)
{
    StartComm(thread, num, bq, Consumer); // 复用
}
// 生产者
void StartProductor(vector<Thread<BlockQueue<int>>> *thread, int num, BlockQueue<int> &bq)
{
    StartComm(thread, num, bq, Productor); // 复用
}
// 等待
void WaitAllThread(vector<Thread<BlockQueue<int>>> &threads)
{
    for (auto &t : threads)
    {
        t.Join();
    }
}
int main()
{
    BlockQueue<int> *bq = new BlockQueue<int>(5);//阻塞队列
    vector<Thread<BlockQueue<int>>> threads;
    StartProductor(&threads, 1, *bq); // 单生产 -- bq是传引用，保证同一个
    StartConsumer(&threads, 1, *bq);  // 单消费
    WaitAllThread(threads); // 等待
    return 0;
}